package _18_Singleton;

/**
 * 设计模式 : 就是在编码实践中,人们发现很多的编码方式会经常用到,于是就总结出来,形成固定的结构,叫做设计模式
 * 
 * 单例模式的意义 :
 * 在需要多次初始化同一个对象的应用程序中,为了保证初始化对象只有一个,已达到节约内存的目的
 * 
 * 目的 : 实例化多次,得到同一个对象,让某个类只能被实例化一次
 * 
 * 实现步骤 :
 * 
 * 首先我们要控制创建对象的数量,就不能让用户决定创建和不创建
 * 比如 : 有一个钱箱子,里面有1000W现金,无人看守,只有一个牌子,写着,每人100,禁止多拿
 * 这样是没有用的,总会有人破坏规矩,原因很简单,因为拿多少的权利在用户这里,不好控制
 * 那怎么办 ?
 * 专门有人看着发钱,每人100,这个时候每个人的数量的决定权,就不在用户这里了,给你几张你就要几张
 * 
 * 同理 : 我想只创建一个对象,那么这个权利肯定不能交给用户控制,因为也控制不住
 * 所以,我们不让客户直接创建对象,我们给你创建,你要使用对象的时候,找我要,我就给你
 * 这个时候,给你哪个对象是我说了算
 * 既然不能让用户直接创建对象,也就意味着,不能让用户访问我们的构造方法
 * 所以,第一步应该构造方法私有化
 * 
 * 1.构造方法私有化
 * 上面几个步骤,我们已经把构造方法私有化,就意味着,用户创建不了对象
 * 那么这个时候,我们必须提供一个让用户能够获取对象的一个方法
 * 这个方法,必须是静态的方法
 * 
 * 2.创建一个公共的静态方法,用来返回当前类的实例化对象,并且保证只能实例化一次
 * 获取对象的方法有了,还需要一个存储对象的变量,这个变量必须和类的生命周期相关
 * 如果是局部变量,这个变量具有临时性,下一次调用这个方法的时候,局部变量又要初始化,对象还是要更改
 * 如果是成员变量,能在静态方法中直接操作成员变量吗?不能
 * 所以,存储变量一定是静态的
 * 并且这个变量还要私有化,要么用户直接更改变量的值,怎么办?
 * 
 * 3.创建一个用于存储对象的静态变量(这个变量的类型一定是当前类类型)
 * 
 * 根据对象的创建时机的不同,分为两种 : 
 * 		1.在类加载阶段就初始化对象,叫饿汉模式
 * 		2.在第一次使用的时候,再创建对象,叫懒汉模式
 * 
 * 无论客户怎么获取实例化对象,都只创建一个实例化对象
 * 
 * @author lenovo
 * @Date 2020年7月13日
 * @Time 下午2:45:41
 */
public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(Singleton_01.getInstance());
		System.out.println(Singleton_01.getInstance());
		System.out.println(Singleton_01.getInstance());
		System.out.println("====");
		System.out.println(Singleton_02.getInstance());
		System.out.println(Singleton_02.getInstance());
		System.out.println(Singleton_02.getInstance());
	}

}
